package com.baizhi.controller;

import com.alibaba.fastjson.JSONObject;
import com.baizhi.entity.*;
import com.baizhi.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;

import javax.servlet.http.HttpSession;
import java.util.*;

@RestController
@RequestMapping("cart")
public class CartController {
    @Autowired
    private ProductService productService;
    /*redis实现购物车的思路：   redis中外层key是用户ID   内层key是商品ID  内层的value是购物商品的数量
    *   添加、删除、修改操作只需要操作redis  不操作MySQL
    *   查询时：从redis中获取购买商品的数量，从MySQL中获取购买商品的信息
    * */
    @RequestMapping("add")
    public Map addCart(Integer pid,HttpSession session){
        Map map = new HashMap();
        try {
            //0、创建jedis对象
            Jedis jedis = new Jedis("localhost",6379);
            //1、从session中获取用户
            User user = (User) session.getAttribute("login");
            //2、根据用户ID和商品ID   判断该用户是否在redis中保存有该pid对应的数据
            boolean b = jedis.hexists("" + user.getId(), "" + pid);
            if(b){
                //如果redis中已经有了该商品  就将它的数量加1
                jedis.hincrBy(""+user.getId(),""+pid,1);
            }else {
                //否则  就向redis中新增一个数据（用户对应的商品）  数量为1
                jedis.hset(""+user.getId(),""+pid,""+1);
            }
            //3、关闭jedis
            jedis.close();
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }

    @RequestMapping("show")
    public Map showCart(HttpSession session,Integer page,Integer limit){
        //0、创建jedis对象
        Jedis jedis = new Jedis("localhost",6379);
        //1、从session中获取用户
        User user = (User) session.getAttribute("login");
        //2、根据用户ID获取其对应的redis中的value（是个hash）
        Map<String, String> smap = jedis.hgetAll("" + user.getId());
        //3、用建遍历  获取上面map中所有的key 也就是商品编号
        List<Item> list = new ArrayList<>();//定义一个list  用来保存所有的商品条目  用于展示购物车
        Set<String> set = smap.keySet();
        for (String s : set) {
            //先创建一个item对象  购物车内每一行数据就是一个item对象
            Item item = new Item();
            //这里的s是smap中的key  也是商品编号
            //a、获取购物车内该商品的购物数量并保存到item中  是在redis中保存的内层value值
            String ssize = smap.get(s);//ssize就是此item中的购买数量 不过的转换为int类型
            item.setSize(Integer.parseInt(ssize.toString()));
            //b、根据商品ID  从MySQL中查询出该商品的所有信息 并保存到item中
            Product product = productService.selectById(Integer.parseInt(s.toString()));
            item.setProduct(product);
            //c、将item添加到list集合中
            list.add(item);
        }
        //4、设置响应给页面的数据格式
        Map map = new HashMap();
        map.put("code",0);
        map.put("msg","");
        map.put("count",list.size());
        map.put("data",list);
        //5、关闭jedis
        jedis.close();
        return map;
    }

    @RequestMapping("remove")
    public Map removarItem(HttpSession session,Integer pid){
        Map map = new HashMap();
        try {
            //0、创建jedis对象
            Jedis jedis = new Jedis("localhost",6379);
            //1、从session中获取用户
            User user = (User) session.getAttribute("login");
            //2、根据用户ID和商品ID  即redis中的外层key  和内层key删除对应的数据
            jedis.hdel(""+user.getId(),""+pid);
            //3、关闭jedis
            jedis.close();
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }

    @RequestMapping("minus")
    public Map minus(HttpSession session,Integer pid){
        Map map = new HashMap();
        try {
            //0、创建jedis对象
            Jedis jedis = new Jedis("localhost",6379);
            //1、从session中获取用户
            User user = (User) session.getAttribute("login");
            //2、根据用户ID和商品ID  给其对应的内层value的值加1
            jedis.hincrBy(""+user.getId(),""+pid,-1);
            //判断更新后的内层value  即购买数量是不是等于0  是则删除该数据
            String ssize = jedis.hget("" + user.getId(), "" + pid);
            if(Integer.parseInt(ssize.toString())==0){
                jedis.hdel("" + user.getId(), "" + pid);
            }
            //3、关闭jedis
            jedis.close();
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }
    @RequestMapping("plus")
    public Map plus(HttpSession session,Integer pid){
        Map map = new HashMap();
        try {
            //0、创建jedis对象
            Jedis jedis = new Jedis("localhost",6379);
            //1、从session中获取用户
            User user = (User) session.getAttribute("login");
            //2、根据用户ID和商品ID  给其对应的内层value的值加1
            jedis.hincrBy(""+user.getId(),""+pid,1);
            //3、关闭jedis
            jedis.close();
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }
}
